package top.lixunda.ecommerce.server.good.api.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import top.lixunda.commerce.common.core.entity.MessageObject;
import top.lixunda.common.validate.XumValid;
import top.lixunda.ecommerce.server.business.api.entity.dto.PageDTO;
import top.lixunda.ecommerce.server.good.api.entity.db.GoodsDO;
import top.lixunda.ecommerce.server.good.api.entity.dto.*;
import top.lixunda.ecommerce.server.good.api.entity.vo.GoodGroupVO;
import top.lixunda.ecommerce.server.good.api.entity.vo.GoodsStoreVO;
import top.lixunda.ecommerce.server.good.api.entity.vo.GoodsVO;
import top.lixunda.ecommerce.server.good.api.entity.vo.SysGoodCategoryVO;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author Xumda
 * @version time:2019/12/27 15:46
 * <p>
 * 商品基本数据，不包含图片，图片在subGood中
 */
@SuppressWarnings("unused")
@RequestMapping("/goods")
@Api("商品基本数据操作接口")
public interface IGoodsController {

    /**
     * 根据id获取商品数据
     * 只能查询普通用户可见的商品信息
     *
     * @param id 商品id
     * @return 商品列表
     */
    @ApiOperation("根据id查询商品基本信息")
    @GetMapping("/queryById")
    MessageObject<GoodsVO> queryById(@RequestParam("id") Integer id);

    /**
     * 根据id获取多个商品数据
     * 只能查询普通用户可见的商品信息
     *
     * @param ids 商品id列表
     * @return 商品列表
     */
    @ApiOperation("根据id查询商品基本信息")
    @PostMapping("/queryByIds")
    MessageObject<List<GoodsVO>> queryByIds(@RequestBody List<Integer> ids);

    /**
     * 根据条件筛选商品信息，需要分页
     * 只能查询普通用户可见的商品信息
     *
     * @param pageDTO 查询条件DTO
     * @return 商品列表
     */
    @ApiOperation("根据条件筛选商品信息，需要分页")
    @PostMapping("queryGoodsByPageWrapper")
    MessageObject<IPage<GoodsVO>> queryGoodsByPageWrapper(
            @RequestBody @XumValid PageDTO<GoodsDO, GoodsQueryDTO> pageDTO);

    /**
     * 根据id获取商品数据，商家端调用，只能查询该店铺的商品信息
     *
     * @param id 商品id
     * @return 商品列表
     */
    @ApiOperation("根据id获取商品数据，商家端调用，只能查询该店铺的商品信息")
    @GetMapping("/queryByIdStore")
    MessageObject<GoodsStoreVO> queryByIdStore(@RequestParam("id") Integer id);

    /**
     * 根据id获取多个商品数据
     * 商家端调用，只能查询该店铺的商品信息
     *
     * @param ids 商品id列表
     * @return 商品列表
     */
    @ApiOperation("根据ids查询多个商品基本信息,商家端调用，只能查询该店铺的商品信息")
    @PostMapping("/queryByIdsStore")
    MessageObject<List<GoodsStoreVO>> queryByIdsStore(@RequestBody List<Integer> ids);

    /**
     * 根据条件筛选商品信息，需要分页
     * 商家端调用，只能查询该店铺的商品信息
     *
     * @param pageDTO 查询条件DTO
     * @return 商品列表
     */
    @ApiOperation("根据条件筛选商品信息，需要分页,商家端调用，只能查询该店铺的商品信息")
    @PostMapping("queryGoodsByPageWrapperStore")
    MessageObject<IPage<GoodsStoreVO>> queryGoodsByPageWrapperStore(
            @RequestBody @XumValid PageDTO<GoodsDO, GoodsStoreQueryDTO> pageDTO);

    /**
     * 根据id获取商品数据
     * 管理员端调用，可以查询所有商品信息
     *
     * @param id 商品id
     * @return 商品列表
     */
    @ApiOperation("根据id查询商品基本信息,管理员端调用，可以查询所有商品信息")
    @GetMapping("/queryByIdAdmin")
    MessageObject<GoodsVO> queryByIdAdmin(@RequestParam("id") Integer id);

    /**
     * 根据id获取多个商品数据
     * 管理员端调用，可以查询所有商品信息
     *
     * @param ids 商品id列表
     * @return 商品列表
     */
    @ApiOperation("根据id查询商品基本信息,管理员端调用，可以查询所有商品信息")
    @PostMapping("/queryByIdsAdmin")
    MessageObject<List<GoodsVO>> queryByIdsAdmin(@RequestBody List<Integer> ids);

    /**
     * 根据条件筛选商品信息，需要分页
     * 管理员端调用，可以查询所有商品信息
     *
     * @param pageDTO 查询条件DTO
     * @return 商品列表
     */
    @ApiOperation("根据条件筛选商品信息，需要分页,管理员端调用，可以查询所有商品信息")
    @PostMapping("queryGoodsByPageWrapperAdmin")
    MessageObject<IPage<GoodsVO>> queryGoodsByPageWrapperAdmin(
            @RequestBody @XumValid PageDTO<GoodsDO, GoodsAdminQueryDTO> pageDTO);

    /**
     * 添加商品新的商品数据
     *
     * @param files 商品图片
     * @param goodsInsertDTO 商品数据列
     * @return 返回是否添加成功
     */
    @ApiOperation("添加商品新的商品数据")
    @PostMapping("addGood")
    MessageObject<Boolean> addGood(MultipartFile[] files,
                                   @XumValid GoodsInsertDTO goodsInsertDTO);

    /**
     * 修改商品信息DTO
     *
     * @param files 需要添加的商品图片
     * @param goodsChangeDTO 修改的商品数据
     * @return 是否修改成功
     */
    @ApiOperation("修改商品信息DTO")
    @PostMapping("changeGood")
    MessageObject<Boolean> changeGood(MultipartFile[] files,
                                      @XumValid GoodsChangeDTO goodsChangeDTO);

    /**
     * 根据id移除商品信息，店铺调用，只能移除自己店铺的商品数据
     *
     * @param ids 商品id
     * @return 是否移除成功
     */
    @ApiOperation("根据id移除商品信息，店铺调用，只能移除自己店铺的商品数据")
    @PostMapping("removeGoodsByIds")
    MessageObject<Boolean> removeGoodsByIds(@RequestBody List<Integer> ids);

    /**
     * 根据子商品id列表移除子商品数据，店铺调用，只能移除自己店铺的商品数据，且移除后该商品至少包含一个子商品
     *
     * @param ids 子商品id列表
     * @return 是否移除成功
     */
    @ApiOperation("根据子商品id列表移除子商品数据，店铺调用，只能移除自己店铺的商品数据，且移除后该商品至少包含一个子商品")
    @PostMapping("removeSubGoodsByIds")
    MessageObject<Boolean> removeSubGoodsByIds(@RequestBody List<Integer> ids);

    /**
     * 店铺调用，查询当前店铺中商品的所有Category信息
     *
     * @return List<SysGoodCategoryVO>
     */
    @ApiOperation("店铺调用，查询当前店铺中商品的所有Category信息")
    @GetMapping("queryStoreGoodCategory")
    MessageObject<List<SysGoodCategoryVO>> queryStoreGoodCategory();

    /**
     * 店铺调用，查询当前店铺中商品的所有Group信息
     *
     * @return List<GoodGroupVO>
     */
    @ApiOperation("店铺调用，查询当前店铺中商品的所有Group信息")
    @GetMapping("queryStoreGoodGroup")
    MessageObject<List<GoodGroupVO>> queryStoreGoodGroup();

    /**
     * 店铺调用，查询当前店铺中商品的所有SellPoint信息
     *
     * @return List<String>
     */
    @ApiOperation("店铺调用，查询当前店铺中商品的所有SellPoint信息")
    @GetMapping("queryStoreGoodSellPoint")
    MessageObject<List<String>> queryStoreGoodSellPoint();

    /**
     * 店铺调用，查询当前店铺中商品的所有Freight信息
     *
     * @return List<BigDecimal>
     */
    @ApiOperation("店铺调用，查询当前店铺中商品的所有Freight信息")
    @GetMapping("queryStoreGoodFreight")
    MessageObject<List<BigDecimal>> queryStoreGoodFreight();

    /**
     * 店铺调用，查询当前店铺中商品的部分信息筛选项
     *
     * @return Map String,List
     */
    @ApiOperation("店铺调用，查询当前店铺中商品的部分信息筛选项")
    @GetMapping("queryStoreGoodTableFilter")
    MessageObject<Map<String, Set>> queryStoreGoodTableFilter();

    /**
     * 店铺调用，提交商品进行审核
     *
     * @param ids 商品数据id列表
     * @return 是否提交申请成功
     */
    @ApiOperation("店铺调用，提交商品进行审核")
    @PostMapping("pushGoodsCheckPending")
    MessageObject<Boolean> pushGoodsCheckPending(@RequestBody List<Integer> ids);

    /**
     * 店铺调用，取消提交的商品审核
     *
     * @param ids 商品数据id列表
     * @return 是否成功取消
     */
    @ApiOperation("店铺调用，取消提交的商品审核")
    @PostMapping("cancelGoodsCheckPending")
    MessageObject<Boolean> cancelGoodsCheckPending(@RequestBody List<Integer> ids);

    /**
     * 店铺调用，上架商品
     *
     * @param ids 商品数据id列表
     * @return 是否上架成功
     */
    @ApiOperation("店铺调用，上架商品")
    @PostMapping("pushGoods")
    MessageObject<Boolean> pushGoods(@RequestBody List<Integer> ids);

    /**
     * 店铺调用，下架商品
     *
     * @param ids 商品数据id列表
     * @return 是否下架成功
     */
    @ApiOperation("店铺调用，下架商品")
    @PostMapping("pullGoods")
    MessageObject<Boolean> pullGoods(@RequestBody List<Integer> ids);

    /**
     * 管理员调用，审核添加的商品
     *
     * @param list 审核数据信息
     * @return 审核结果
     */
    @ApiOperation("管理员调用，审核添加的商品")
    @PostMapping("checkingGoods")
    MessageObject<Boolean> checkingGoods(@RequestBody List<AdminCheckingDTO> list);

}
